Išnagrinėkite JavaScript dekoratorius patikimam parametrų validavimui. Išmokite, kaip įdiegti dekoratorių argumentų tikrinimą, kad kodas būtų švaresnis ir patikimesnis.
JavaScript Dekoratoriai Parametrų Validavimui: Duomenų Integriteto Užtikrinimas
Šiuolaikiniame JavaScript kūrime, užtikrinti funkcijoms ir metodams perduodamų duomenų vientisumą yra itin svarbu. Viena galinga technika tai pasiekti yra naudojant dekoratorius parametrų validavimui. Dekoratoriai, funkcija, prieinama JavaScript per Babel arba natūraliai TypeScript, suteikia švarų ir elegantišką būdą pridėti funkcionalumą funkcijoms, klasėms ir savybėms. Šis straipsnis gilinasi į JavaScript dekoratorių pasaulį, ypač sutelkiant dėmesį į jų taikymą argumentų tikrinimui, siūlant praktinius pavyzdžius ir įžvalgas visų lygių kūrėjams.
Kas yra JavaScript Dekoratoriai?
Dekoratoriai yra projektavimo šablonas, leidžiantis dinamiškai ir statiškai pridėti elgseną esamai klasei, funkcijai ar savybei. Iš esmės, jie "dekoruoja" esamą kodą nauju funkcionalumu, nekeisdami paties originalaus kodo. Tai atitinka SOLID projektavimo Atvirumo/Uždarumo principą, kuris teigia, kad programinės įrangos vienetai (klasės, moduliai, funkcijos ir kt.) turėtų būti atviri plėtrai, bet uždari modifikavimui.
JavaScript, dekoratoriai yra ypatinga deklaracijos rūšis, kurią galima pridėti prie klasės deklaracijos, metodo, prieigos metodo, savybės ar parametro. Jie naudoja @expression sintaksę, kur expression turi grąžinti funkciją, kuri bus iškviesta vykdymo metu su informacija apie dekoruotą deklaraciją.
Norint naudoti dekoratorius JavaScript, paprastai reikia naudoti transpilerį, pvz., Babel su įjungtu @babel/plugin-proposal-decorators įskiepiu. TypeScript palaiko dekoratorius natūraliai.
Dekoratorių Naudojimo Parametrų Validavimui Privalumai
Dekoratorių naudojimas parametrų validavimui suteikia keletą privalumų:
- Geresnis Kodo Skaitomumas: Dekoratoriai suteikia deklaratyvų būdą išreikšti validavimo taisykles, todėl kodą lengviau suprasti ir prižiūrėti.
- Mažiau Pasikartojančio Kodo: Užuot kartojus validavimo logiką keliose funkcijose, dekoratoriai leidžia ją apibrėžti vieną kartą ir taikyti visoje kodo bazėje.
- Pagerintas Kodo Pakartotinis Panaudojimas: Dekoratorius galima pakartotinai naudoti skirtingose klasėse ir funkcijose, skatinant kodo pakartotinį panaudojimą ir mažinant pertekliškumą.
- Atsakomybių Atskyrimas: Validavimo logika yra atskirta nuo pagrindinės funkcijos verslo logikos, o tai lemia švaresnį ir modularesnį kodą.
- Centralizuota Validavimo Logika: Visos validavimo taisyklės yra apibrėžtos vienoje vietoje, todėl jas lengviau atnaujinti ir prižiūrėti.
Parametrų Validavimo Įgyvendinimas Naudojant Dekoratorius
Panagrinėkime, kaip įgyvendinti parametrų validavimą naudojant JavaScript dekoratorius. Pradėsime nuo paprasto pavyzdžio, o vėliau pereisime prie sudėtingesnių scenarijų.
Pagrindinis Pavyzdys: Eilutės Parametro Validavimas
Apsvarstykime funkciją, kuri tikisi eilutės tipo parametro. Galime sukurti dekoratorių, kad užtikrintume, jog parametras tikrai yra eilutė.
function validateString(target: any, propertyKey: string | symbol, parameterIndex: number) {
let existingParameters: any[] = Reflect.getOwnMetadata('validateParameters', target, propertyKey) || [];
existingParameters.push({ index: parameterIndex, validator: (value: any) => typeof value === 'string' });
Reflect.defineMetadata('validateParameters', existingParameters, target, propertyKey);
const originalMethod = target[propertyKey];
target[propertyKey] = function (...args: any[]) {
const metadata = Reflect.getOwnMetadata('validateParameters', target, propertyKey);
if (metadata) {
for (const item of metadata) {
const { index, validator } = item;
if (!validator(args[index])) {
throw new Error(`Parameter at index ${index} is invalid`);
}
}
}
return originalMethod.apply(this, args);
};
}
function validate(...validators: ((value: any) => boolean)[]) {
return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
for (let i = 0; i < validators.length; i++) {
if (!validators[i](args[i])) {
throw new Error(`Parameter at index ${i} is invalid`);
}
}
return originalMethod.apply(this, args);
};
};
}
function isString(value: any): boolean {
return typeof value === 'string';
}
class Example {
@validate(isString)
greet( @validateString name: string) {
return `Hello, ${name}!`;
}
}
const example = new Example();
try {
console.log(example.greet("Alice")); // Output: Hello, Alice!
// example.greet(123); // Throws an error
} catch (error:any) {
console.error(error.message);
}
Paaiškinimas:
validateStringdekoratorius taikomasgreetmetodonameparametrui.- Jis naudoja
Reflect.defineMetadatairReflect.getOwnMetadata, kad išsaugotų ir gautų su metodu susijusius validavimo metaduomenis. - Prieš iškviečiant originalų metodą, jis peržiūri validavimo metaduomenis ir pritaiko validatoriaus funkciją kiekvienam parametrui.
- Jei kuris nors parametras nepraeina validavimo, išmetama klaida.
validatedekoratorius suteikia bendresnį ir labiau komponuojamą būdą taikyti validatorius parametrams, leidžiant nurodyti kelis validatorius kiekvienam parametrui.isStringfunkcija yra paprastas validatorius, kuris patikrina, ar reikšmė yra eilutė.Exampleklasė demonstruoja, kaip naudoti dekoratoriusgreetmetodonameparametrui validuoti.
Pažangesnis Pavyzdys: El. Pašto Formato Validavimas
Sukurkime dekoratorių, kuris patikrintų, ar eilutės parametras yra galiojantis el. pašto adresas.
function validateEmail(target: any, propertyKey: string | symbol, parameterIndex: number) {
let existingParameters: any[] = Reflect.getOwnMetadata('validateParameters', target, propertyKey) || [];
existingParameters.push({ index: parameterIndex, validator: (value: any) => {
const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g;
return typeof value === 'string' && emailRegex.test(value);
} });
Reflect.defineMetadata('validateParameters', existingParameters, target, propertyKey);
const originalMethod = target[propertyKey];
target[propertyKey] = function (...args: any[]) {
const metadata = Reflect.getOwnMetadata('validateParameters', target, propertyKey);
if (metadata) {
for (const item of metadata) {
const { index, validator } = item;
if (!validator(args[index])) {
throw new Error(`Parameter at index ${index} is not a valid email address`);
}
}
}
return originalMethod.apply(this, args);
};
}
class User {
register( @validateEmail email: string) {
return `Registered with email: ${email}`;
}
}
const user = new User();
try {
console.log(user.register("test@example.com")); // Output: Registered with email: test@example.com
// user.register("invalid-email"); // Throws an error
} catch (error:any) {
console.error(error.message);
}
Paaiškinimas:
validateEmaildekoratorius naudoja reguliariąją išraišką, kad patikrintų, ar parametras yra galiojantis el. pašto adresas.- Jei parametras nėra galiojantis el. pašto adresas, išmetama klaida.
Kelių Validatorių Derinimas
Galite derinti kelis validatorius naudodami validate dekoratorių ir pasirinktines validatorių funkcijas.
function isNotEmptyString(value: any): boolean {
return typeof value === 'string' && value.trim() !== '';
}
function isPositiveNumber(value: any): boolean {
return typeof value === 'number' && value > 0;
}
class Product {
@validate(isNotEmptyString, isPositiveNumber)
create(name: string, price: number) {
return `Product created: ${name} - $${price}`;
}
}
const product = new Product();
try {
console.log(product.create("Laptop", 1200)); // Output: Product created: Laptop - $1200
// product.create("", 0); // Throws an error
} catch (error:any) {
console.error(error.message);
}
Paaiškinimas:
isNotEmptyStringvalidatorius patikrina, ar eilutė nėra tuščia, pašalinus tarpus iš galų.isPositiveNumbervalidatorius patikrina, ar reikšmė yra teigiamas skaičius.validatedekoratorius naudojamas abiem validatoriams pritaikytiProductklasėscreatemetodui.
Geriausios Praktikos Naudojant Dekoratorius Parametrų Validavimui
Štai keletas geriausių praktikų, į kurias reikėtų atsižvelgti naudojant dekoratorius parametrų validavimui:
- Išlaikykite Dekoratorius Paprastus: Dekoratoriai turėtų būti sutelkti į validavimo logiką ir vengti sudėtingų skaičiavimų.
- Pateikite Aiškius Klaidų Pranešimus: Užtikrinkite, kad klaidų pranešimai būtų informatyvūs ir padėtų kūrėjams suprasti validavimo nesėkmes.
- Naudokite Prasmingus Pavadinimus: Pasirinkite aprašomuosius pavadinimus savo dekoratoriams, kad pagerintumėte kodo skaitomumą.
- Dokumentuokite Savo Dekoratorius: Dokumentuokite savo dekoratorių paskirtį ir naudojimą, kad juos būtų lengviau suprasti ir prižiūrėti.
- Atsižvelkite į Našumą: Nors dekoratoriai suteikia patogų būdą pridėti funkcionalumą, nepamirškite jų poveikio našumui, ypač našumui jautriose programose.
- Naudokite TypeScript Pagerintai Tipų Saugai: TypeScript teikia integruotą palaikymą dekoratoriams ir pagerina tipų saugą, todėl lengviau kurti ir prižiūrėti dekoratoriais pagrįstą validavimo logiką.
- Kruopščiai Testuokite Savo Dekoratorius: Rašykite vienetų testus, kad užtikrintumėte, jog jūsų dekoratoriai veikia teisingai ir tinkamai tvarko skirtingus scenarijus.
Realaus Pasaulio Pavyzdžiai ir Naudojimo Atvejai
Štai keletas realaus pasaulio pavyzdžių, kaip dekoratorius galima naudoti parametrų validavimui:
- API Užklausų Validavimas: Dekoratorius galima naudoti gaunamų API užklausų parametrų validavimui, užtikrinant, kad jie atitiktų laukiamus duomenų tipus ir formatus. Tai apsaugo nuo netikėtos elgsenos jūsų vidinėje logikoje. Apsvarstykite scenarijų, kai API galinis taškas tikisi vartotojo registracijos užklausos su tokiais parametrais kaip
username,emailirpassword. Dekoratoriai gali būti naudojami patikrinti, ar šie parametrai yra, ar jie yra teisingo tipo (eilutės) ir atitinka konkrečius formatus (pvz., el. pašto adreso patvirtinimas naudojant reguliariąją išraišką). - Formos Įvesties Validavimas: Dekoratorius galima naudoti formos įvesties laukų validavimui, užtikrinant, kad vartotojai įvestų teisingus duomenis. Pavyzdžiui, patikrinti, ar pašto kodo laukelyje yra galiojantis pašto kodo formatas konkrečiai šaliai.
- Duomenų Bazės Užklausų Validavimas: Dekoratorius galima naudoti duomenų bazės užklausoms perduodamų parametrų validavimui, siekiant išvengti SQL injekcijos pažeidžiamumų. Užtikrinant, kad vartotojo pateikti duomenys būtų tinkamai išvalyti prieš juos naudojant duomenų bazės užklausoje. Tai gali apimti duomenų tipų, ilgių ir formatų tikrinimą, taip pat specialių simbolių pakeitimą, siekiant išvengti kenkėjiško kodo injekcijos.
- Konfigūracijos Failų Validavimas: Dekoratorius galima naudoti konfigūracijos failų nustatymų validavimui, užtikrinant, kad jie yra priimtinuose diapazonuose ir teisingo tipo.
- Duomenų Serializavimas/Deserializavimas: Dekoratorius galima naudoti duomenų validavimui serializavimo ir deserializavimo procesų metu, užtikrinant duomenų vientisumą ir apsaugant nuo duomenų sugadinimo. JSON duomenų struktūros tikrinimas prieš juos apdorojant, reikalaujamų laukų, duomenų tipų ir formatų užtikrinimas.
Dekoratorių Palyginimas su Kitomis Validavimo Technikomis
Nors dekoratoriai yra galingas įrankis parametrų validavimui, svarbu suprasti jų stipriąsias ir silpnąsias puses, palyginti su kitomis validavimo technikomis:
- Rankinis Validavimas: Rankinis validavimas apima validavimo logikos rašymą tiesiogiai funkcijose. Šis požiūris gali būti varginantis ir linkęs į klaidas, ypač esant sudėtingoms validavimo taisyklėms. Dekoratoriai siūlo labiau deklaratyvų ir pakartotinai naudojamą požiūrį.
- Validavimo Bibliotekos: Validavimo bibliotekos pateikia iš anksto sukurtų validavimo funkcijų ir taisyklių rinkinį. Nors šios bibliotekos gali būti naudingos, jos gali būti ne tokios lanksčios ar pritaikomos kaip dekoratoriai. Bibliotekos, tokios kaip Joi ar Yup, puikiai tinka schemoms apibrėžti, kad būtų galima validuoti ištisus objektus, o dekoratoriai pasižymi individualių parametrų validavimu.
- Tarpinė Programinė Įranga (Middleware): Tarpinė programinė įranga dažnai naudojama užklausų validavimui interneto programose. Nors tarpinė programinė įranga tinka visoms užklausoms validuoti, dekoratoriai gali būti naudojami smulkesniam atskirų funkcijos parametrų validavimui.
Išvada
JavaScript dekoratoriai suteikia galingą ir elegantišką būdą įgyvendinti parametrų validavimą. Naudodami dekoratorius galite pagerinti kodo skaitomumą, sumažinti pasikartojančio kodo kiekį, pagerinti kodo pakartotinį panaudojamumą ir atskirti validavimo logiką nuo pagrindinės verslo logikos. Nesvarbu, ar kuriate API, interneto programas ar kitokio tipo programinę įrangą, dekoratoriai gali padėti užtikrinti duomenų vientisumą ir sukurti patikimesnį bei lengviau prižiūrimą kodą.
Nagrinėdami dekoratorius, nepamirškite laikytis geriausių praktikų, atsižvelgti į realaus pasaulio pavyzdžius ir palyginti dekoratorius su kitomis validavimo technikomis, kad nustatytumėte geriausią požiūrį pagal savo konkrečius poreikius. Tvirtai suprasdami dekoratorius ir jų taikymą parametrų validavime, galite žymiai pagerinti savo JavaScript kodo kokybę ir patikimumą.
Be to, didėjantis TypeScript, kuris siūlo natūralų dekoratorių palaikymą, pritaikymas daro šią techniką dar patrauklesnę šiuolaikiniam JavaScript kūrimui. Dekoratorių pritaikymas parametrų validavimui yra žingsnis link švaresnių, lengviau prižiūrimų ir patikimesnių JavaScript programų rašymo.